#include "seqqueue.h"

#ifndef null
define null NULL
#endif
    /**
     * 通过下面的定义来选择队列饿模型的选择 
     * 如果定义 TAIL_HEADER，第一种模型
     * 如果不定义 TAIL_HEADER，第二种模型
     **/
    // #define TAIL_HEADER // 0

    extern funSeqList SeqListfunc;

/**
 * 功 能：
 *      创建一个队列
 * 参 数：
 *      capacity：队列的最大容量
 * 返回值：
 *      成功：操作句柄
 *      失败：NULL
 **/
SeqQueue *SeqQueue_Create(int capacity)
{
    return SeqListfunc.create(capacity);
}
/**
 * 功 能：
 *      销毁一个队列
 * 参 数：
 *      Queue：要操作的队列
 * 返回值：
 *      成功：0
 *      失败：-1
 **/
int SeqQueue_Destory(SeqQueue *Queue)
{
    return SeqListfunc.destory(Queue);
}
/**
 * 功 能：
 *      清空一个队列
 * 参 数：
 *      Queue：要操作的队列
 * 返回值：
 *      成功：0
 *      失败：-1
 **/
int SeqQueue_Clear(SeqQueue *Queue)
{
    return SeqListfunc.clear(Queue);
}

/**
 * 功 能：
 *      获取队列的长度
 * 参 数：
 *      Queue：要操作的队列
 * 返回值：
 *      成功：队列的长度
 *      失败：-1
 **/
int SeqQueue_Length(SeqQueue *Queue)
{
    return SeqListfunc.length(Queue);
}

/**
 * 功 能：
 *      获取队列的最大容量
 * 参 数：
 *      Queue：要操作的队列
 * 返回值：
 *      成功：队列得容量
 *      失败：-1
 **/
int SeqQueue_Capacity(SeqQueue *Queue)
{
    return SeqListfunc.capacity(Queue);
}

/**
 * 功 能：
 *      插入元素
 * 参 数：
 *      Queue：要操作的队列
 *      node : 要插入的元素
 * 返回值：
 *      成功：0
 *      失败：-1
 **/
int SeqQueue_Append(SeqQueue *Queue, SeqQueueNode *node)
{
#ifdef TAIL_HEADER
    return SeqListfunc.insert(Queue, node, 0);
#else
    return SeqListfunc.insert(Queue, node, SeqListfunc.length(Queue));
#endif
}
/**
 * 功 能：
 *      获取队列的元素
 * 参 数：
 *      Queue：要操作的队列
 * 返回值：
 *      成功：操作句柄
 *      失败：NULL
 **/
SeqQueueNode *SeqQueue_Header(SeqQueue *Queue)
{
#ifdef TAIL_HEADER
    return SeqListfunc.get(Queue, SeqListfunc.length(Queue) - 1);
#else
    return SeqListfunc.get(Queue, 0);
#endif
}

/**
 * 功 能：
 *      删除队列
 * 参 数：
 *      Queue：要操作的队列
 * 返回值：
 *      成功：删除后的元素
 *      失败：NULL
 **/
SeqQueueNode *SeqQueue_Subtract(SeqQueue *Queue)
{
#ifdef TAIL_HEADER
    return SeqListfunc.delete(Queue, SeqListfunc.length(Queue) - 1);
#else
    return SeqListfunc.delete(Queue, 0);
#endif
}

func_SeqQueue fun_SeqQueue = {
    SeqQueue_Create,
    SeqQueue_Destory,
    SeqQueue_Clear,
    SeqQueue_Length,
    SeqQueue_Capacity,
    SeqQueue_Append,
    SeqQueue_Header,
    SeqQueue_Subtract};
